package com.sky.service.courier.impl;

import cn.hutool.core.util.StrUtil;
import com.sky.constant.MessageConstant;
import com.sky.exception.ParameterInvalidException;
import com.sky.mapper.courier.CourierMapper;
import com.sky.mapper.courier.CourierTradeOrderMapper;
import com.sky.pojo.Courier;
import com.sky.pojo.CourierTradeOrder;
import com.sky.service.courier.CourierTradeService;
import com.sky.utils.MapUtils;
import com.sky.vo.CourierTradeOrderVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.geo.Point;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.time.Duration;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 骑手运单业务实现
 *
 * @author zgp
 * @version V1.0
 * @date 2025-02-20 11:18
 */
@Slf4j
@Service
public class CourierTradeServiceImpl implements CourierTradeService {
    @Autowired
    private CourierTradeOrderMapper courierTradeOrderMapper;
    @Autowired
    private CourierMapper courierMapper;
    @Autowired
    private RedisTemplate redisTemplate;


    @Override
    public List<CourierTradeOrderVO> getPendingOrders(Integer status, Integer courierId) {
        // 根据骑手id和运单状态查询运单
        List<CourierTradeOrder> courierTradeOrders = courierTradeOrderMapper.selectByCourierIdAndStatus(courierId, status);
        List<CourierTradeOrderVO> courierTradeOrderVOS = new ArrayList<>();
        // TODO 商家地理位置写死
        redisTemplate.opsForGeo().add("courierTradeOrderLocation", new Point(116.310511, 40.056611), "merchant_1");
        courierTradeOrders.forEach(o -> {
            CourierTradeOrderVO courierTradeOrderVO = new CourierTradeOrderVO();
            BeanUtils.copyProperties(o, courierTradeOrderVO);
            // 计算商家和当前外卖员的距离
            Courier courier = courierMapper.selectByIds(List.of(courierId)).get(0);
            //  存入骑手位置
            String[] curLngth = courier.getCurLocation().split(",");
            redisTemplate.opsForGeo().add("courierTradeOrderLocation", new Point(Double.valueOf(curLngth[0]), Double.valueOf(curLngth[1])), "courier_" + courier.getId());
            double shopAndCourierDistance = redisTemplate.opsForGeo().distance("courierTradeOrderLocation", "merchant_1", "courier_" + courier.getId()).getValue();
            // double shopAndCourierDistance = MapUtils.calculateDistance(courier.getCurLocation(), MapUtils.addressToLnglat(o.getShopAddress()));
            courierTradeOrderVO.setShopAndCourierDistance(shopAndCourierDistance);
            // 计算商家和顾客的距离
            // 存入顾客位置
            String[] customerLngth = MapUtils.addressToLnglat(o.getCustomerAddress()).split(",");
            redisTemplate.opsForGeo().add("courierTradeOrderLocation", new Point(Double.valueOf(customerLngth[0]), Double.valueOf(customerLngth[1])), "customer_" + o.getTelephone());
            double shopToUserDistance = redisTemplate.opsForGeo().distance("courierTradeOrderLocation", "merchant_1", "customer_" + o.getTelephone()).getValue();
            // double shopToUserDistance = MapUtils.calculateDistance(MapUtils.addressToLnglat(o.getShopAddress()), MapUtils.addressToLnglat(o.getCustomerAddress()));
            courierTradeOrderVO.setShopAndCustomerDistance(shopToUserDistance);
            // 计算当前时间和顾客期望时间的差值
            long seconds = Duration.between(LocalDateTime.now(), o.getCustomerExpectedDeliveryTime()).getSeconds();
            courierTradeOrderVO.setCurrentTimeAndCustomerExpectedTime(seconds);
            courierTradeOrderVOS.add(courierTradeOrderVO);
        });
        // 添加序号：根据下单时间降序排
        AtomicInteger num = new AtomicInteger(1);
        List<CourierTradeOrderVO> resultList = courierTradeOrderVOS.stream()
                .sorted(Comparator.comparing(CourierTradeOrderVO::getShopAndCustomerDistance))
                .map(o -> {
                    o.setMarkSort(num.getAndIncrement());
                    return o;
                }).toList();
        log.info("courierTradeOrderVOS = {}", courierTradeOrderVOS);
        return resultList;
    }

    @Override
    public CourierTradeOrder getTradeOrderByOrderNo(String orderNo) {
        if (StrUtil.isEmpty(orderNo)) {
            throw new ParameterInvalidException(MessageConstant.PARAMES_IS_INVALID);
        }
        return courierTradeOrderMapper.selectByOrderNumber(orderNo);
    }
}
